/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import Componenten.*;

/**
 *
 * @author Bram Slob en Roderick van Seijen
 */
public class Bord implements LocalTypes {
    
    private int levelCode;
    private Modus speelModus;
    private int score;
    private Vak[][] vakMatrix; 
    private Element speler;
    
    public Bord(){
        speelModus = Modus.VOLWASSENE;
    }
    
    public void initLevel(int lvl){
        score = 0;
        levelCode = lvl;
        
        String level = Level.getLevel(lvl);
        int kolommen = Level.getAantalKolommen();
        int rijen = Level.getAantalRijen();
        
        vakMatrix = new Vak[rijen][kolommen];
        for (int y = 0; y < rijen; ++y)
        {
            for (int x = 0; x < kolommen; ++x)
            {
                vakMatrix[y][x] = new Vak(new Coordinaat(x,y));
            }
        }
        
        int rij = 0;
        int kolom = 0;
        
        Vak vk;
        for(int i = 0; i < level.length(); i++){
            char dit = level.charAt(i);
            
            if (dit == '\n'){ 
                vk = null;
            } else {
                vk = vakMatrix[rij][kolom];
            }
            switch(dit){
                case '\n':
                    rij += 1;
                    kolom = 0;
                    break;
                    
                case '#': // muur
                    vk.setVakType(VakType.NORMAAL);
                    vk.setElement(new Element(ElementType.MUUR, vk));
                    break;
                case ' ': // leeg vak
                    vk.setVakType(VakType.NORMAAL);
                    vk.setElement(null);
                    break;
                case '.': // muur
                    vk.setVakType(VakType.EINDVAK);
                    vk.setElement(null);
                    break;
                case '@': // speler op normaal vak
                    vk.setVakType(VakType.NORMAAL);
                    vk.setElement(new Element(ElementType.SPELER, vk));
                    speler = vk.getElement();
                    break;
                case '+': // speler op eindvlak
                    vk.setVakType(VakType.EINDVAK);
                    vk.setElement(new Element(ElementType.SPELER, vk));
                    speler = vk.getElement();
                    break;
                case '$': // doos
                    vk.setVakType(VakType.NORMAAL);
                    vk.setElement(new Element(ElementType.DOOS, vk));
                    break;
                case '*': // doos op eindvlak
                    vk.setVakType(VakType.EINDVAK);
                    vk.setElement(new Element(ElementType.DOOS, vk));
                    break;
                
            }
            if(dit != '\n'){
                if(rij != 0){
                    vk.setBuurvak(Richting.NOORD, vakMatrix[rij -1][kolom]);
                }
                if(rij != rijen - 1){
                    vk.setBuurvak(Richting.ZUID, vakMatrix[rij + 1][kolom]);
                }
                if(kolom != 0){
                    vk.setBuurvak(Richting.WEST, vakMatrix[rij][kolom - 1]);
                }
                if(kolom != kolommen - 1){
                    vk.setBuurvak(Richting.OOST, vakMatrix[rij][kolom + 1]);
                }
                
                kolom += 1;  
            }

        }
    }

    public int getLevelCode() {
        return levelCode;
    }
    
    public void reinitLevel(){
        if(levelCode == 0){ levelCode = 1; }
        initLevel(levelCode);
    }
    
    public Vak[][] getVakMatrix(){
        return vakMatrix;
    }
    
    public Modus getSpeelModus(){
        return speelModus;
    }
    
    public void setSpeelModus(Modus m){
        speelModus = m;
    }
    
    public int getScore(){
        return score;
    }
    
    public void setScore(int score){
        this.score = score;
    }
    
    public int beweegSpeler(Richting r){
        if (speler.beweeg(r, speelModus)) {
            score += 1;
        }
        return score;
    }
     
}
